/*
 *  Copyright 2010 INFN - APE group
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

#pragma once

#include <sys/time.h>
#include <boost/noncopyable.hpp>

#include <cuos/config.h>
#include <cuos/types.h>
#include <cuos/detail/system_services.h>

namespace cuos
{
    namespace host {

        class runtime;
        class handler;

        handler *make_handler(sys_req_t *req);

        class handler: boost::noncopyable {
        protected:
            sys_req_t m_req;
            sys_rep_t m_rep;
            struct timeval m_init_tm;
            struct timeval m_reply_tm;
            struct timeval m_done_tm;

        public:
            handler(sys_req_t *req);
            virtual ~handler();
            virtual bool done() = 0;
            virtual int progress(runtime *rtm) = 0;

            friend handler *make_handler(sys_req_t *req);
        };

        handler *make_mpi_send_handler(sys_req_t *req);
        handler *make_mpi_recv_handler(sys_req_t *req);

    } // end namespace host
    
} // end namespace cuos

/*
 * Local variables:
 *  mode: c++
 *  c-indent-level: 4
 *  c-basic-offset: 4
 *  tab-width: 4
 *  indent-tabs-mode: nil
 * End:
 */
